//package com.heima.wemedia.service.impl;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONArray;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.core.metadata.IPage;
//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.heima.common.constants.message.NewsAutoScanConstants;
//import com.heima.common.constants.wemedia.WemediaConstants;
//import com.heima.common.exception.CustException;
//import com.heima.common.exception.CustomException;
//import com.heima.model.common.dtos.PageResponseResult;
//import com.heima.model.common.dtos.ResponseResult;
//import com.heima.model.common.enums.AppHttpCodeEnum;
//import com.heima.model.wemedia.dots.NewsAuthDto;
//import com.heima.model.wemedia.dots.WmNewsPageReqDto;
//import com.heima.model.wemedia.pojos.*;
//import com.heima.model.wemedia.vo.WmNewsVo;
//import com.heima.utils.threadlocal.WmThreadLocalUtils;
//import com.heima.wemedia.contyoller.v1.WmMaterialController;
//import com.heima.wemedia.mapper.WmMaterialMapper;
//import com.heima.wemedia.mapper.WmNewsMapper;
////import com.heima.wemedia.service.WmNewsService;
//import com.heima.wemedia.mapper.WmNewsMaterialMapper;
//import com.heima.wemedia.service.WmNewsService;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.BeanUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.kafka.core.KafkaTemplate;
//import org.springframework.stereotype.Service;
//
//import java.util.*;
//import java.util.stream.Collectors;
//
//@Service
//@Slf4j
//public class WmNewsServiceImpl extends ServiceImpl<WmNewsMapper, WmNews> implements WmNewsService {
//
//    @Autowired
//    WmNewsMaterialMapper wmNewsMaterialMapper;
//
//    @Autowired
//    KafkaTemplate<String,String> kafkaTemplate;
//
//    @Value("${file.oss.web-site}")
//    String webSite;
//
//    @Override
//    public ResponseResult findList(WmNewsPageReqDto dto) {
//        //1 校验参数  dto 分页  判断登录情况
//        if (dto == null) {
//            CustException.cust(AppHttpCodeEnum.PARAM_INVALID);
//        }
//        dto.checkParam();
//
//        WmUser user = WmThreadLocalUtils.getUser();
//        if (user == null) {
//            CustException.cust(AppHttpCodeEnum.NEED_LOGIN);
//        }
//        //2. 封装查询参数
//        //2.1 分页条件
//        IPage pageReq = new Page(dto.getPage(), dto.getSize());
//        //2.2 查询条件
//        LambdaQueryWrapper<WmNews> queryWrapper = new LambdaQueryWrapper<>();
//        //    1 判断标题条件
//        if (StringUtils.isNotBlank(dto.getKeyword())) {
//            queryWrapper.like(StringUtils.isNotBlank(dto.getKeyword()), WmNews::getTitle, dto.getKeyword());
//        }
//        //    2. 频道
//        if (dto.getChannelId() != null) {
//            queryWrapper.eq(WmNews::getChannelId, dto.getChannelId());
//        }
//        //    3. 状态
//        if (dto.getStatus() != null) {
//            queryWrapper.eq(WmNews::getStatus, dto.getStatus());
//        }
//        //    4. 开始时间 结束时间
//        if (dto.getBeginPubdate() != null && dto.getEndPubdate() != null) {
//            // 查时间区间
//            queryWrapper.between(WmNews::getPublishTime, dto.getBeginPubdate(), dto.getEndPubdate());
//        }
//        //    5. 当前登录用户ID
//        queryWrapper.eq(WmNews::getUserId, user.getId());
//        //    6. 按照创建时间降序排序
//        queryWrapper.orderByDesc(WmNews::getCreatedTime);
//        //3. 执行查询， 结果加上图片访问前缀
//        IPage<WmNews> pageResult = page(pageReq, queryWrapper);
//        PageResponseResult responseResult = new PageResponseResult(dto.getPage(),
//                dto.getSize(), pageResult.getTotal(), pageResult.getRecords());
//        responseResult.setHost(webSite); //
//        return responseResult;
//    }
//
//    @Override
//    public ResponseResult submitNews(WmNewsDto wmNewsDto) {
//        // 1. 校验参数  (基于dto创建WmNews)
//        if(wmNewsDto == null || StringUtils.isBlank(wmNewsDto.getContent())){
//            CustException.cust(AppHttpCodeEnum.PARAM_INVALID,"文章内容不能为空");
//        }
//        Short status = wmNewsDto.getStatus();
//        if(status == null || (status.intValue() != 0 && status.intValue() != 1)){
//            CustException.cust(AppHttpCodeEnum.PARAM_INVALID,"文章状态错误");
//        }
//        WmUser user = WmThreadLocalUtils.getUser();
//        if(user == null){
//            CustException.cust(AppHttpCodeEnum.NEED_LOGIN);
//        }
//
//        WmNews wmNews = new WmNews();
//        BeanUtils.copyProperties(wmNewsDto,wmNews);
//        // 封面图片
//        List<String> imagesList = wmNewsDto.getImages();
//        if(imagesList!=null && imagesList.size()>0){
//            // 图片集合  ==>  替换掉图片前缀  使用逗号将字符串拼接在一起
//            wmNews.setImages(imagesTostr(imagesList));
//        }
//        // 因为数据库该字段时无符号，使用负数会保存，暂时设置为null
//        // 一会自动生成封面图时在设置
//        if(wmNewsDto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)){
//            wmNews.setType(null);
//        }
//        wmNews.setUserId(user.getId());// 用户
//        // 2. 保存或修改 wmNews文章 (id)
//        saveOrUpdateWmNews(wmNews);
//        // 如果是草稿 不用处理关联关系
//        if(wmNewsDto.getStatus().equals(WemediaConstants.WM_NEWS_DRAFT_STATUS)){
//            return ResponseResult.okResult();
//        }
//        // 3. 保存文章和素材的关联关系
//        // 3.1 先抽取出文章内容中 所涉及的所有图片url
//        // [{type:image   value:"" },{}]
//        List<Map> contentMaps = JSONArray.parseArray(wmNewsDto.getContent(), Map.class);
//        List<String> contentUrlList = parseContentImages(contentMaps);
//        // 3.2 保存文章内容和素材的关联关系
//        if(contentUrlList!=null && contentUrlList.size()>0){
//            // 保存 内容中图片和素材的关联关系
//            saveRelativeInfo(wmNews.getId(),contentUrlList,WemediaConstants.WM_CONTENT_REFERENCE);
//        }
//        // 3.3 保存文章封面和素材的关联关系
//        saveRelativeInfoForCover(wmNewsDto,wmNews,contentUrlList);
//
////         发送自动审核文章的消息通知
//        Map map = new HashMap();
//        map.put("wmNewsId",wmNews.getId());
//        kafkaTemplate.send(NewsAutoScanConstants.WM_NEWS_AUTO_SCAN_TOPIC, JSON.toJSONString(map));
//        log.info("自动审核的消息通知成功发送  主题:{}  文章id:{}", NewsAutoScanConstants.WM_NEWS_AUTO_SCAN_TOPIC,wmNews.getId());
//        return ResponseResult.okResult();
//    }
//
//    @Override
//    public ResponseResult delNewsById(Integer id) {
//        //检验参数
//        if (id == null) {
//            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
//        }
//        //根据id查询自媒体文章
//        WmNews wmNews = getById(id);
//        if (wmNews == null) {
//            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
//        }
//        //判断状态是否为上架状态，发布状态
//        if (WmNews.Status.PUBLISHED.getCode() == wmNews.getStatus() && WemediaConstants.WM_NEWS_UP.equals(wmNews.getEnable())) {
//            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_ALLOW, "发布并且上架的文章不可以删除");
//        }
//        //删除关联关系
//        wmNewsMaterialMapper.delete(Wrappers.<WmNewsMaterial>lambdaQuery().eq(WmNewsMaterial::getNewsId, id));
//        //删除文章信息
//        removeById(id);
//        return ResponseResult.okResult();
//    }
//
//    @Override
//    public ResponseResult findWmNewsById(Integer id) {
//        //检查参数
//        if (id == null) {
//            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
//        }
//        //执行查询
//        WmNews wmNews = getById(id);
//        if (wmNews == null) {
//            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
//        }
//        //返回结果
//        ResponseResult responseResult = ResponseResult.okResult(wmNews);
//        responseResult.setHost(webSite);
//        return responseResult;
//
//    }
//
//    @Override
//    public ResponseResult downOrUp(WmNewsDto dto) {
//        //检验参数
//        if (dto == null || dto.getId() == null) {
//            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
//        }
//        // 查询文章
//        WmNews wmNews = getById(dto.getId());
//        if (wmNews == null) {
//            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
//        }
//        //查看文章是否发布
//        if (wmNews.getStatus().equals(WmNews.Status.PUBLISHED.getCode())) {
//            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST, "文章不是发布状态，不能上下架");
//        }
//        //4.修改文章状态，同步到app端（后期做）TODO
//        if (dto.getEnable() != null && dto.getEnable() > -1 && dto.getEnable() < 2) {
//            update(Wrappers.<WmNews>lambdaUpdate().eq(WmNews::getId, dto.getId())
//                    .set(WmNews::getEnable, dto.getEnable()));
//        }
//        return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
//
//    }
//
//    @Autowired
//    WmNewsMapper wmNewsMapper;
//
//
//    @Override
//    public ResponseResult findListVo(NewsAuthDto dto) {
//        // 1. 参数校验
//        dto.checkParam();
//        if(StringUtils.isNotBlank(dto.getTitle())){
//            dto.setTitle("%"+dto.getTitle()+"%");
//        }
//        Integer page = dto.getPage(); // 第几页
//        dto.setPage( (page - 1) * dto.getSize() ); // 计算偏移量
//        // 3. 调用mapper查询 list  查询 总数量
//        List<WmNewsVo> listAndPage = wmNewsMapper.findListAndPage(dto);
//        long count = wmNewsMapper.findListCount(dto);
//        // 4. 封装分页返回结果
//        PageResponseResult responseResult = new PageResponseResult(page,dto.getSize(),count,listAndPage);
//        return responseResult;
//    }
//
//    @Override
//    public ResponseResult findWmNewsVo(Integer id) {
//        return ResponseResult.okResult(wmNewsMapper.findWmNewsVo(id));
//    }
//
//    private void saveRelativeInfoForCover(WmNewsDto wmNewsDto, WmNews wmNews, List<String> contentUrlList) {
//
//        List<String> images = wmNewsDto.getImages();
//        if (WemediaConstants.WM_NEWS_TYPE_AUTO.equals(wmNewsDto.getType())) {
//            if (contentUrlList == null || contentUrlList.size() == 0) {
//                wmNews.setType(WemediaConstants.WM_NEWS_NONE_IMAGE);
//            } else if (contentUrlList.size() > 0 && contentUrlList.size() < 3) {
//                wmNews.setType(WemediaConstants.WM_NEWS_SINGLE_IMAGE);
//                images = contentUrlList.stream().limit(1).collect(Collectors.toList());
//            } else {
//                wmNews.setType(WemediaConstants.WM_NEWS_MANY_IMAGE);
//                images = contentUrlList.stream().limit(3).collect(Collectors.toList());
//            }
//            if (images != null && images.size() > 0) {
//                wmNews.setImages(imagesTostr(images));
//                updateById(wmNews);
//            }
//        }
//        //保存图片列表和素材的关系
//        if (images != null && images.size() > 0) {
//            images = images.stream().map(url->url.replaceAll(webSite,"")).collect(Collectors.toList());
//            saveRelativeInfo(wmNews.getId(),images,WemediaConstants.WM_IMAGE_REFERENCE);
//        }
//    }
//
//    @Autowired
//    WmMaterialMapper wmMaterialMapper;
//    private void saveRelativeInfo(Integer newsId,List<String> materialUrls,Short refType){
//        // 1. 先根据url列表 查询出对应的素材信息  素材表:   1. aaa.jpg       2. aaa.jpg
//
//        // 素材列表
//        List<WmMaterial> wmMaterials = wmMaterialMapper.selectList(
//                Wrappers.<WmMaterial>lambdaQuery().eq(WmMaterial::getUserId, WmThreadLocalUtils.getUser().getId())
//                        .in(WmMaterial::getUrl, materialUrls)
//        );
//        if(wmMaterials == null || wmMaterials.size() == 0){
//            CustException.cust(AppHttpCodeEnum.DATA_NOT_EXIST,"关联的指定素材不存在");
//        }
//
//        // 2. 提取出素材列表中的 id  和 素材url路径  用  map :  key:素材url     value: id
//        Map<String, Integer> urlAndIdMap = wmMaterials.stream()
//                .collect(Collectors.toMap(WmMaterial::getUrl, WmMaterial::getId));
//
//        // 3. 判断传入的素材 是否全部存在， 如果在 收集每个素材对应的id
//        List<Integer> materialIds = new ArrayList<>();
//        materialUrls.forEach((url)->{
//            if(!urlAndIdMap.containsKey(url)){
//                CustException.cust(AppHttpCodeEnum.DATA_NOT_EXIST,"关联的指定素材不存在");
//            }
//            materialIds.add(urlAndIdMap.get(url));
//        });
//        // 保存关联关系
//        wmNewsMaterialMapper.saveRelations(materialIds,newsId,refType);
//    }
//
//    private List<String> parseContentImages(List<Map> contentMaps) {
//        List<String> list = contentMaps.stream()
//                .filter(map -> map.get("type").equals(WemediaConstants.WM_NEWS_TYPE_IMAGE))
//                .map(map -> (String) map.get("value"))
//                .map(url -> url.replaceAll(webSite, ""))
//                .collect(Collectors.toList());
//        return list;
//    }
//
//    private void saveOrUpdateWmNews(WmNews wmNews) {
//// 1. 补全wmNews信息  创建时间
//        wmNews.setCreatedTime(new Date());
//        wmNews.setSubmitedTime(new Date());
//        // 2. 判断id是否为空
//        if (wmNews.getId() == null) {
//            // 2.1 为空   save wmNews
//            save(wmNews);
//        } else {
//            wmNewsMaterialMapper.delete(Wrappers
//                    .<WmNewsMaterial>lambdaQuery()
//                    .eq(WmNewsMaterial::getNewsId, wmNews.getId()));
//            // 2.2 不为空   先删除 素材和文章的关系    在修改文章
//            updateById(wmNews);
//        }
//    }
//
//    private String imagesTostr(List<String> imagesList) {
//        return imagesList.stream()
//                .map((url) -> url.replace(webSite, ""))
//                .collect(Collectors.joining(","));
//    }
//}
